#include "Socket.h"
#include "Server.h"


/*构造函数*/
Server::Server(int mode, int port, char* ip_addr):Socket( mode,  port, ip_addr)
{
    
}

Server::~Server()
{
    close(ser_skf);
}

/**
 * @Author: 王占坤
 * @Description: 这个是需要在服务端启用的接收信息的进程。
 * @Param: 无
 * @Return: socketfd 建立好的用于监听的句柄
 * @Throw: 
 */
void Server::startServer()
{
    this->ser_skf = createSocket();
    if(ser_skf == -1)//失败信息已输出
        return;
    struct sockaddr_in ser_addr;
    initialzeSocketaddr(&ser_addr, this->ip_);
    bindSocketAddr((struct sockaddr *)&ser_addr, sizeof(ser_addr));
    createListen(1024);
    return;
}


/**
 * @Author: 王占坤
 * @Description: 将socket绑定至指定地址
 * @Param: socketfd* skf_socketfd 待被绑定地址的socket句柄
 * @Param：const struct sockaddr* addr_sockaddr被绑定的地址
 * @Param：int addrlen 地址长度
 * @Return: void
 * @Throw: 
 */
void Server::bindSocketAddr( struct sockaddr *addr_sockaddr, int addrlen)
{
    int res = bind(ser_skf, addr_sockaddr, addrlen);
    if (res == -1) //失败
    {
        perror("bind");
    }
}

/**
 * @Author: 王占坤
 * @Description: 对需要进行监听的socket开启监听
 * @Param: socketfd& skf, 需要进行监听的socket
 * @Param：int num, 最大等待接收消息的socket句柄的数量
 * @Return: void
 * @Throw: 
 */
void Server::createListen(int num)
{
    int res = listen(ser_skf, num);
    if (res == -1) //执行失败
    {
        perror("listen");
    }
}

/**
 * @Author: 王占坤
 * @Description: 监听到有连接时进行连接
 * @Param: 
 * @Return: 
 * @Throw: 
 */
socketfd Server::acceptConnection(struct sockaddr *addr, socklen_t len_addr)
{
    //判断是否连接如果可以连接返回新建的
    socketfd cli_skf = accept(this->ser_skf, addr, &len_addr);
    if (cli_skf == -1)
    {
        printf("accept socket error: %s(errno: %d)", strerror(errno), errno);
    }
    return cli_skf;
}

